#include"Calculator.hpp"
#include"Parser.hpp"
#include"TcpServer.hpp"
#include"Deamon.hpp"

#include<memory>

void Usage(std::string proc)
{
    std::cerr << "Usage: " << proc << " serverport" << std::endl;
}

//./server serverport
int main(int argc , char * argv[])
{
    if(argc != 2)
    {
        Usage(argv[0]);
        return 0;
    }

    //该服务会受用户的登录、退出影响：不让网络服务处于会话内部，将该任务单独拿取出来，让他形成一个与bash 并行的独立会话  --> 守护进程
    //需要注意的是，进程组中的组长不能调用setsid 来让当前进程组形成独立会话；并且想让一个会话完全摆脱中断，有两种做法：一是将stdin stdout stder 
    //全部关闭，而是将他们重定向到 /dev/null 中
    //将让服务端变为守护进程的方法封装成一个模块
    Deamon();

    // EnableConsoleLogStrategy();//指定刷新策略
    //守护进程，可以将日志信息保存在文件中
    EnableFileLogStrategy();

    uint16_t port = std::stoi(argv[1]);

    //处理请求模块 - 计算
    std::unique_ptr<Calculator> cal = std::make_unique<Calculator>();

    //解析
    std::unique_ptr<Parser> parser = std::make_unique<Parser>([&cal](Request& req)->Response{
        return cal->Exec(req);
    });

    // std::unique_ptr<TcpServer> svr = std::make_unique<TcpServer>(port);
    //网络层读取数据
    std::unique_ptr<TcpServer> svr = std::make_unique<TcpServer>(port,
    [&parser](std::string& inbuffer)->std::string{
        return parser->Parse(inbuffer);
    });
    svr->Run();
    return 0;
}